﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using Gacn.ControleAlunos.Library.Business;
using Gacn.ControleAlunos.Library.Entities;
using System.Text;

namespace Gacn.ControleAlunos.WebApplication
{
    public partial class RealizarPresencaBulk : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnEnviar_Click(object sender, EventArgs e)
        {
            List<int> IDs = ConfirmaValidadeDosDados();
            
            if(IDs != null)
            {
                RealizaPresenca(IDs);
                MostrarSucessoParaUsuario();
            }
            else
            {
                MostrarFalhaParaUsuario();
            }

            LimparTela();

        }

        private List<int> ConfirmaValidadeDosDados()
        {
            StringBuilder sb = new StringBuilder();
            int linhaDoErro = 1;
            List<int> IDs = new List<int>();

            if (fileUploadPresencas.HasFile &&
                fileUploadPresencas.FileContent.CanRead &&
                !datepicker.Text.Equals(""))
                try
                {
                    DateTime data = DateTime.Parse(datepicker.Text);

                    using (StreamReader stRead = new StreamReader(fileUploadPresencas.PostedFile.InputStream))
                        while (!stRead.EndOfStream)
                        {
                            IDs.Add(int.Parse(stRead.ReadLine()));
                            linhaDoErro++;
                        }

                    txtResultado.Visible = false;
                    txtResultado.Text = "";
                    return IDs;
                }
                catch (Exception e)
                {
                    sb.AppendLine("Houve falha na validação dos dados. A presença não foi realizada");
                    sb.Append("Linha onde o erro ocorreu: ");
                    sb.Append(linhaDoErro);
                    sb.AppendLine("\n");
                    sb.AppendLine(e.Message);
                    sb.AppendLine(e.StackTrace);
                    sb.AppendLine(e.Data.ToString());

                    txtResultado.Visible = true;
                    txtResultado.Text = sb.ToString();

                    return null;
                }

            sb.AppendLine("Houve falha na validação dos dados.");
            sb.AppendLine("Possíveis causas de erro:");
            sb.AppendLine("- Verifique se o arquivo foi selecionado");
            sb.AppendLine("- Verifique se a data está no formato AAAA/MM/DD.");

            txtResultado.Visible = true;
            txtResultado.Text = sb.ToString();


            return null;

        }

        private void LimparTela()
        {
            datepicker.Text = "";
        }

        private bool RealizaPresenca(List<int> IDs)
        {
            try
            {
                DateTime data = DateTime.Parse(datepicker.Text);
                List<PresencaEntity> presencas = new List<PresencaEntity>();

                foreach(int i in IDs)
                    presencas.Add(new PresencaEntity(i, data));

                PresencaBiz.SalvaPresenca(presencas);

                return true;

            }
            catch (Exception e)
            {
                StringBuilder sb = new StringBuilder();
                    
                sb.AppendLine(e.Message);
                sb.AppendLine("\n");
                sb.AppendLine(e.StackTrace);
                sb.AppendLine(e.Data.ToString());

                txtResultado.Visible = true;
                txtResultado.Text = sb.ToString();

                return false;
            }
        }

        private void MostrarFalhaParaUsuario()
        {
            imgSucesso.Visible = false;
            imgErro.Visible = true;
        }

        private void MostrarSucessoParaUsuario()
        {
            imgSucesso.Visible = true;
            imgErro.Visible = false;
        }
    }
}